858428fd14b5dd5e461b136a43dd0b9c7cdd4f8f,samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/CalculatedQuestionExtractListener.java,CalculatedQuestionExtractListener,validateFormulas,#ItemBean#,270

Before Change


        long dummyGradingId = 1;
        String dummyAgentId = "dummy";
        
        for (int attemptCnt = 0; attemptCnt < 100; attemptCnt++) {
        
            // create random values for the variables to substitute into the formulas
            Map<String, String> answersMap = service.determineRandomValuesForRanges(variableRangeMap, dummyItemId, 
                    dummyGradingId, dummyAgentId, attemptCnt);
            
            // evaluate each formula
            for (CalculatedQuestionFormulaBean formulaBean : item.getCalculatedQuestion().getActiveFormulas().values()) {
                String formulaStr = formulaBean.getText();
                formulaBean.setValidated(true);
                String substitutedFormulaStr = service.replaceMappedVariablesWithNumbers(formulaStr, answersMap);
                
                // look for wrapped variables that haven't been replaced (undefined variable)
                List<String> unwrappedVariables = service.extractVariables(substitutedFormulaStr);
                if (unwrappedVariables.size() > 0) {
                    formulaBean.setValidated(false);
                    errors.put(9, "Wrapped variable not found");
                } else {
                    try {

After Change


     * value is the string result of that error message.
     */
    private List<String> validateFormulas(ItemBean item, GradingService service) {
        List<String> errors = new ArrayList<String>();
        SamigoExpressionParser parser = new SamigoExpressionParser();
        if (service == null) {
            service = new GradingService();
        }
        
        // list of variables to substitute
        Map<String, String> variableRangeMap = new HashMap<String, String>();
        for (CalculatedQuestionVariableBean variable : item.getCalculatedQuestion().getActiveVariables().values()) {
            String match = variable.getMin() + "|" + variable.getMax() + "," + variable.getDecimalPlaces();
            variableRangeMap.put(variable.getName(), match);
        }
        
        // dummy variables needed to generate random values within ranges for the variables
        long dummyItemId = 1;
        long dummyGradingId = 1;
        String dummyAgentId = "dummy";
        
        int attemptCnt = 0;
        while (attemptCnt < 100 && errors.size() == 0) {
        
            // create random values for the variables to substitute into the formulas
            Map<String, String> answersMap = service.determineRandomValuesForRanges(variableRangeMap, dummyItemId, 
                    dummyGradingId, dummyAgentId, attemptCnt);
            
            // evaluate each formula
            for (CalculatedQuestionFormulaBean formulaBean : item.getCalculatedQuestion().getActiveFormulas().values()) {
                String formulaStr = formulaBean.getText();
                
                if (formulaStr == null || formulaStr.length() == 0) {
                    formulaBean.setValidFormula(false);
                    errors.add(getErrorMessage("empty_field"));                    
                } else {
                    String substitutedFormulaStr = service.replaceMappedVariablesWithNumbers(formulaStr, answersMap);
                    
                    // look for wrapped variables that haven't been replaced (undefined variable)
                    List<String> unwrappedVariables = service.extractVariables(substitutedFormulaStr);
                    if (unwrappedVariables.size() > 0) {
                        formulaBean.setValidFormula(false);
                        errors.add(getErrorMessage("samigo_formula_error_9"));
                    } else {
                        try {
                            if (isNegativeSqrt(substitutedFormulaStr, service)) {